<?php
interface goDBException {};

abstract class goDBRuntimeException extends RuntimeException implements goDBException {}
abstract class goDBLogicException extends LogicException implements goDBException {}

/**
 * Ошибка подключения
 */
class goDBExceptionConnect extends goDBRuntimeException {}

/**
 * Ошибка в запросе
 */
class goDBExceptionQuery extends goDBLogicException
{
    public function __construct($query, $result)
    {
        $error  =  pg_result_error($result);
        $msg = 'DB Error. Query="'.$query.'" error = "'.$error.'"';
        parent::__construct($msg);
        $this->query = $query;
        $this->error = $error;
    }

    public function query() {return $this->query;}
    public function error() {return $this->error;}

    public function __toString()
    {
        return htmlspecialchars($this->getMessage());
    }

    private $query, $errno, $error;
}

/**
 * Несоответствие количество плейсхолдеров и входных данных
 */
abstract class goDBExceptionData extends goDBLogicException {}


/**
 * Данных больше плейсхолдеров
 */
class goDBExceptionDataMuch extends goDBExceptionData {}

/**
 * Данных меньше плейсхолдеров
 */
class goDBExceptionDataNotEnough extends goDBExceptionData {}

/**
 * Неизвестный плейсхолдер
 */
class goDBExceptionDataPlaceholder extends goDBExceptionData
{
    public function __construct($placeholder, $code = null) {
        $message = 'Unknown placeholder "'.$placeholder.'"';
        parent::__construct($message, $code);
    }
}

/**
 * В запросе используются именованные плейсхолдеры наравне с регулярными
 */
class goDBExceptionDataMixed extends goDBExceptionData {}

/**
 * Неверный fetch
 */
class goDBExceptionFetch extends goDBLogicException
{
    public function __construct($fetch, $code = null) {
        $message = 'Unknown fetch "'.$fetch.'"';
        parent::__construct($message, $code);
    }
}


/**
 * Проблемы со списком баз данных в пространстве имен DB
 */
abstract class goDBExceptionDB extends goDBLogicException {}
class goDBExceptionDBAlready  extends goDBExceptionDB {}
class goDBExceptionDBNotFound extends goDBExceptionDB {}

?>